from langchain.chat_models import ChatOpenAI
from langchain.agents import AgentType, initialize_agent, Tool
from langchain.memory import ConversationBufferMemory
import requests
from dotenv import load_dotenv
import os
import openai  # 导入openai库用于代理配置

# 加载环境变量
load_dotenv()

# 如需代理，在此处配置（无代理可删除）
openai.proxy = {
    "http": "http://你的代理地址:端口",
    "https": "https://你的代理地址:端口"
}

# 1. 天气查询工具函数
def get_weather(city: str) -> str:
    """查询指定城市的实时天气，输入为城市名称（如北京、上海）"""
    weather_url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={os.getenv('WEATHER_API_KEY')}&units=metric"
    try:
        response = requests.get(weather_url, timeout=10)
        data = response.json()
        if data.get("cod") != 200:
            return f"天气查询失败：{data.get('message')}"
        temp = data["main"]["temp"]
        desc = data["weather"][0]["description"]
        return f"{city} 当前气温：{temp}度，天气：{desc}"
    except Exception as e:
        return f"查询出错：{str(e)}"

# 2. 工具列表
tools = [
    Tool(
        name="WeatherQuery",
        func=get_weather,
        description="用于查询城市实时天气，用户问天气时必须调用，不能直接回答"
    )
]

# 3. 初始化本地模型（OpenAI兼容接口）
local_llm = ChatOpenAI(
    model="DeepSeekR1",  # 与你的模型名称一致
    temperature=0.5,     # 匹配接口参数
    max_tokens=500       # 匹配接口参数
)

# 4. 对话记忆
memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

# 5. 初始化Agent
agent = initialize_agent(
    tools=tools,
    llm=local_llm,
    agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
    verbose=True,
    memory=memory
)

# 测试Agent
if __name__ == "__main__":
    agent.run("查询北京今天的天气")
    agent.run("刚才查询的城市适合旅游吗？")
